/*
题目: 模糊坐标
我们有一些二维坐标，如 "(1, 3)" 或 "(2, 0.5)"，然后我们移除所有逗号，小数点和空格，得到一个字符串S。返回所有可能的原始字符串到一个列表中。

原始的坐标表示法不会存在多余的零，所以不会出现类似于"00", "0.0", "0.00", "1.0", "001", "00.01"或一些其他更小的数来表示坐标。此外，一个小数点前至少存在一个数，所以也不会出现“.1”形式的数字。

最后返回的列表可以是任意顺序的。而且注意返回的两个数字中间（逗号之后）都有一个空格。

https://leetcode.cn/problems/ambiguous-coordinates/description/
 */
public class AmbiguousCoordinates {
    public List<String> ambiguousCoordinates(String s) {
        List<String> src = new ArrayList<> ();
        int n = s.length();

        for (int i = 2; i < n - 1; i ++) {
            // 获取 front 可能的 . 字符串 和 rear 可能的 . 字符串
            List<String> front = get(s.substring(1, i));
            List<String> rear = get(s.substring(i, n - 1));

            for (String f : front) {
                for (String r : rear) {
                    src.add("(" + f + ", " + r + ")");
                }
            }
        }

        return src;
    }

    // 获取可能的 . 组合
    private List<String> get(String s) {
        List<String> ret = new ArrayList<> ();

        // 讨论加上整体的情况, 长度为1, 并且整体不以 0 开头
        if (s.length() == 1 || s.charAt(0) != '0') {
            ret.add(s);
        }
        // 最后一位数为 0
        if (s.charAt(s.length() - 1) == '0')   return ret;

        // 小数点分割
        for (int i = 1; i < s.length(); i ++) {
            String front = s.substring(0, i);
            String rear = s.substring(i, s.length());
            // front 中以 0 开头 与 长度为 1 不能同时存在
            if (front.length() == 1 || front.length() > 1 && s.charAt(0) != '0') {
                ret.add(front + "." + rear);
            }
        }

        return ret;
    }
}
